package com.qsw.paper.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qsw.paper.constant.MessageConstants;
import com.qsw.paper.constant.StatusConstants;
import com.qsw.paper.exception.AdminException;
import com.qsw.paper.pojo.dto.AdminLoginDto;
import com.qsw.paper.pojo.entity.Admins;
import com.qsw.paper.mapper.AdminsMapper;
import com.qsw.paper.service.IAdminsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

/**
 * <p>
 * 管理员表 服务实现类
 * </p>
 *
 * @author qsw
 * @since 2024-11-15
 */
@Service
public class AdminsServiceImpl extends ServiceImpl<AdminsMapper, Admins> implements IAdminsService {

    @Override
    public Admins login(@NotNull AdminLoginDto loginDto) {
        // 从数据库查询传入用户名匹配的管理员记录
        Admins admins = getOne(new LambdaQueryWrapper<Admins>().eq(Admins::getUsername, loginDto.getUsername().trim()
                .replace("--","")));

        // 如果管理员不存在，抛出异常提示 "管理员不存在"
        if (admins == null) {
            throw new AdminException(MessageConstants.ADMIN_ERR);
        }

        // 对传入的明文密码进行 MD5 加密
        String password = DigestUtils.md5DigestAsHex(loginDto.getPassword().trim().getBytes());

        // 如果数据库中存储的密码和加密后的传入密码不一致，抛出异常提示 "密码错误"
        if (!admins.getPassword().equals(password)) {
            throw new AdminException(MessageConstants.ADMIN_PASSWORD_ERR);
        }

        // 检查管理员账号状态是否为启用（1 表示启用），如果不是，抛出异常提示 "账号被锁定"
        if (!admins.getStatus().equals(StatusConstants.ONE)) {
            throw new AdminException(MessageConstants.ACCOUNT_LOCKED);
        }

        // 返回管理员信息（登录成功）
        return admins;
    }

}
